//
// Created by QU on 24-6-21.
//
#include <iostream>
#include <string>

template<class T>
void show_type(T t)
{
    std::cout << typeid(t).name() << std::endl;
}


template<class T>
void normal_forwarding(T t)
{
    show_type(t);
}

template<class T>
void perfect_forwarding(T &&t)
{
    show_type(static_cast<T&&>(t));
}

std::string get_string()
{
    return "hi world";
}

int main()
{
    std::string s = "hello world";
    perfect_forwarding(s);

    perfect_forwarding(get_string());
    // 如果使用normal_forwarding, 将出现一次复制
    // 我们也知道使用 函数参数类型为 const T&确实可以接受左值和右值,
    // 但是如果接受的是右值, 我们将会不能更改传入参数的内容, 完美转发就解决了这个问题,
    // 其中利用到了 c++的引用折叠 规则.
}
